#ifndef GPRS_STRUCT_H
#define GPRS_STRUCT_H

#include <QObject>

// 远程升级文件定义
#define GPRS_UPGRADE_FILE_EXAMPLE            1    // BA example(GUI)
#define GPRS_UPGRADE_FILE_DJX_SERVER         2    // BA djx_server
#define GPRS_UPGRADE_FILE_TRANSMIT           3    // DT transmit

// 数据传输和命令定义
#define GPRS_DATA_STACK                      1    // 电池堆数据
#define GPRS_DATA_BA_COM_INPUT_REG           2    // BA 100 通用输入寄存器
#define GPRS_DATA_BANK_ALARM                 10   // 电池组数据 - 告警信息 + 电池组状态
#define GPRS_DATA_BANK_SGL_VOL1              11   // 单体电压   1 - 100
#define GPRS_DATA_BANK_SGL_VOL2              12   // 单体电压 101 - 200
#define GPRS_DATA_BANK_SGL_VOL3              13   // 单体电压 201 - 300
#define GPRS_DATA_BANK_SGL_VOL4              14   // 单体电压 301 - 400
#define GPRS_DATA_BANK_SGL_TEMP1             15   // 单体温度   1 - 100
#define GPRS_DATA_BANK_SGL_TEMP2             16   // 单体温度 101 - 200
#define GPRS_DATA_BANK_SGL_TEMP3             17   // 单体温度 201 - 300
#define GPRS_DATA_BANK_SGL_TEMP4             18   // 单体温度 301 - 400
#define GPRS_DATA_BANK_SGL_SOC1              19   // 单体Soc   1 - 100
#define GPRS_DATA_BANK_SGL_SOC2              20   // 单体Soc 101 - 200
#define GPRS_DATA_BANK_SGL_SOC3              21   // 单体Soc 201 - 300
#define GPRS_DATA_BANK_SGL_SOC4              22   // 单体Soc 301 - 400
#define GPRS_DATA_BANK_SGL_RES1              23   // 单体内阻   1 - 100
#define GPRS_DATA_BANK_SGL_RES2              24   // 单体内阻 101 - 200
#define GPRS_DATA_BANK_SGL_RES3              25   // 单体内阻 201 - 300
#define GPRS_DATA_BANK_SGL_RES4              26   // 单体内阻 301 - 400
#define GPRS_DATA_BANK_SGL_SOH1              27   // 单体Soh   1 - 100
#define GPRS_DATA_BANK_SGL_SOH2              28   // 单体Soh 101 - 200
#define GPRS_DATA_BANK_SGL_SOH3              29   // 单体Soh 201 - 300
#define GPRS_DATA_BANK_SGL_SOH4              30   // 单体Soh 301 - 400
#define GPRS_DATA_BANK_OTHER                 31   // 其他电池组数据

#define GPRS_DATA_BANK_FULFILL               99   // 完成

#define GPRS_CMD_UPGRADE                     100   // 远程升级
#define GPRS_CMD_REBOOT                      101   // 远程重启
#define GPRS_CMD_LAST_VERSION                102   // 回退到上一版本
#define GPRS_CMD_BC_DO3_CUT                  103   // BC DO3 断开
#define GPRS_CMD_BC_DO3_CLOSE                104   // BC DO3 闭合
#define GPRS_CMD_BC_DO4_CUT                  105   // BC DO4 断开
#define GPRS_CMD_BC_DO4_CLOSE                106   // BC DO4 闭合

//////////////////////////////////////////////////////////////////////////
// 结构定义 需要一字节对齐 处理
#ifdef XNWIN
#pragma pack(push)      //保存对齐状态
#pragma pack(1)         //设定为1字节对齐

#define LINUX_PACK_1_BYTE  
#else
#define LINUX_PACK_1_BYTE   __attribute__((packed))
#endif

typedef struct _SCanMutiFrame 
{ 
	unsigned int can_id;   /* 32 bit CAN_ID + EFF/RTR/ERR flags */
	unsigned char can_dlc; /* 数据长度: 0 .. 8 */
	unsigned char data[8]; // Data
}LINUX_PACK_1_BYTE SCanMutiFrame;

// 心跳包 注册包
typedef struct _SHeartbeat
{
	quint16 usAreaCode;       // 地区编码(电话区号)   
	quint8  uStationNo;       // 储能站号
	quint8  uTransmitNo;      // 转发编号	
}LINUX_PACK_1_BYTE SHeartbeat;

// GPRS 消息头定义
typedef struct _SGPRSHead
{
	quint8  uCmdType;         // 命令类型(1Byte)  
	quint8  uModbusAddrBg;    // 后台Modbus地址(1Byte)	 
	quint16 usDataLen;        // 数据长度(2Byte)	      文件传输最后一帧长度
}LINUX_PACK_1_BYTE SGPRSHead;

typedef struct _SUpgradeHead
{
	quint8  uFile;            // 远程升级文件
	quint16 usFrameNum;       // 文件总帧数  
	quint16 usFrameIndex;     // 文件总帧序号	
	quint16 usFrameLen;       // 帧数据长度
}LINUX_PACK_1_BYTE SUpgradeHead;

typedef struct _SNetBattStack 
{
	quint16 usStackState;            // 电池堆状态            1   
	quint16 usBranParalState1;       // 第1支路并联状态      18  
	quint16 usBranParalState2; 	     // 第2支路并联状态      19
	quint16 usBranParalState3; 	     // 第3支路并联状态      20
	quint16 usBranParalState4; 	     // 第4支路并联状态      21
	quint16 usBranState1;            // 第1支路电池堆状态    38         
	quint16 usBranState2;            // 第2支路电池堆状态    39          
	quint16 usBranState3;            // 第3支路电池堆状态    40         
	quint16 usBranState4;            // 第4支路电池堆状态    41

	quint16 usStackStateFull;		 // 电池堆充满           44
	quint16 usStackStateEmpty;		 // 电池堆放空           45
	quint16 usStackStateTempAlarm;	 // 电池堆温度告警       46
	quint16 usStackStateCurAlarm;    // 电池堆电流告警       47
	quint16 usStackStateAllOff;		 // 电池堆接触器全断开   48
	quint16 usStackStateFault;		 // 电池堆保护(PCS故障)  49

	float fStackSoc;                 // 电池堆SOC             2
	float fStackSoh; 	             // 电池堆SOH             4
	float fStackChargeEQ; 	         // 电池堆可充电量        6
	float fStackDischargeEQ;         // 电池堆可放电量        8
	float fStackChargeEQAdd;         // 电池堆充电量累加值    10
	float fStackDischargeEQAdd; 	 // 电池堆放电量累加值    12

	float fStackTotalVol;            // 电池堆总电压         14  
	float fStackTotalCur; 	         // 电池堆总电流         16

	float fBranSoc1; 	             // 第1支路电池SOC       22
	float fBranSoc2; 	             // 第2支路电池SOC       24
	float fBranSoc3; 	             // 第3支路电池SOC       26
	float fBranSoc4; 	             // 第4支路电池SOC       28
	float fBranCur1; 	             // 第1支路当前电流      30
	float fBranCur2; 	             // 第2支路当前电流      32
	float fBranCur3; 	             // 第3支路当前电流      34
	float fBranCur4; 	             // 第4支路当前电流      36

	float fSglTempCompVol;			 // 单体电池温度补偿电压 42	
}LINUX_PACK_1_BYTE SNetBattStack;

typedef struct _SNetBattBankAlarm
{
	char aBankVolDownLimitAlarm;     // 电池组欠压告警         3389   0
	char aBankVolUpLimitAlarm;	     // 电池组过压告警         3390   1
	char aBankCurUpLimitAlarm;		 // 电池组过流告警         3391   2
	char aSglVolDownLimitAlarm;		 // 单节电池欠压告警       3392   3
	char aSglVolUpLimitAlarm;		 // 单节电池过压告警       3393   4
	char aEnvTempUpLimitAlarm;		 // 环境温度过高告警	   3394   5
	char aEnvTempDownLimitAlarm;	 // 环境温度过低告警	   3395   6
	char aSglTempUpLimitAlarm;		 // 单节温度过高告警	   3396	  7
	char aSglTempDownLimitAlarm;	 // 单节温度过低告警	   3397   8
	char aBankSocDownLimitAlarm;	 // SOC超下限告警		   3398
	char aBankResUpLimitAlarm;		 // 内阻过高告警		   3399
	char aBMUConnFaultAlarm;		 // BMU设备连接故障告警	   3400
	char aBCMUConnFaultAlarm;		 // BCMU设备连接故障告警   3401
	char aBankVolDownLimitProt;		 // 电池组欠压保护	       3402
	char aBankVolUpLimitProt;		 // 电池组过压保护	       3403
	char aBankCurUpLimitProt;		 // 电池组过流保护		   3404
	char aSglVolDownLimitProt;		 // 单节电池欠压保护	   3405
	char aSglVolUpLimitProt;		 // 单节电池过压保护	   3406
	char aSglTempUpLimitProt;		 // 单节温度过高保护	   3407
	char aSglTempDownLimitProt;		 // 单节温度过低保护	   3408
	char aEnvTempUpLimitProt;		 // 环境温度过高保护	   3409
	char aEnvTempDownLimitProt;		 // 环境温度过低保护	   3410	
	char aBankSocDownLimitProt;		 // SOC超下限保护		   3411

	quint16 usBankState;             // 蓄电池组充放电状态     425    
}LINUX_PACK_1_BYTE SNetBattBankAlarm;

typedef struct _SNetBattBankOther 
{
	quint16	usSglMaxVolNo;           // 单电池最大电压对应ID号 5758
	quint16	usSglMinVolNo;           // 单电池最小电压对应ID号 5761
	quint16	usSglMaxTempNo;          // 单电池最大温度对应ID号 5764
	quint16	usSglMinTempNo;          // 单电池最小温度对应ID号 5767
	quint16	usSglMaxSocNo;           // 单电池最大SOC对应ID号  5770	
	quint16	usSglMinSocNo;           // 单电池最小SOC对应ID号  5773
	quint16	usSglMaxSohNo;           // 单电池最大SOH对应ID号  5776
	quint16	usSglMinSohNo;           // 单电池最小SOH对应ID号  5779
	quint16	usSglMaxResNo;           // 单电池最大内阻对应ID号 5786
	quint16	usSglMinResNo;           // 单电池最小内阻对应ID号 5789
	quint16	usBCMUInput1;            // BCMU开关状态寄存器Input 1（直流接触器状态）		6000  1--闭合， 0--断开
	quint16	usBCMUInput2; 	         // BCMU Input 2（熔断器1状态）                    	6014
	quint16	usBCMUInput3; 	         // BCMU Input 3（熔断器2状态）	                    6016
	quint16	usBCMUInput4; 	         // BCMU Input 4（手动空开状态）		            6018
	quint16	usBankStatePCS; 	     // 电池组状态（告知PCS）	                        6100  0x1111充满，0x2222放空，0x5555待机，0xaaaa跳机，0xbbbb正常

	float fSglAvgRes;                // 单体电池平均内阻	   5746
	float fSglAvgSoh;                // 单体电池SOH平均值      5748
	float fSglAvgSoc; 	             // 单体电池SOC平均值      5750	
	float fSglAvgTemp; 	             // 单体电池温度平均值     5752
	float fSglAvgVol;                // 单体电池电压平均值     5754
	float fSglMaxVol;                // 单电池电压最大值       5756
	
	float fSglMinVol; 	             // 单电池电压最小值	   5759	
	float fSglMaxTemp;               // 单电池温度最大值	   5762	
	float fSglMinTemp;               // 单电池温度最小值	   5765	
	float fSglMaxSoc;                // 单体SOC最大值		   5768	
	float fSglMinSoc;                // 单体SOC最小值	       5771	
	float fSglMaxSoh;                // 单体SOH最大值	       5774	
	float fSglMinSoh;                // 单体SOH最小值	       5777	
	float fBankSoc;                  // 组SOC		           5780
	float fBankSoh;                  // 组SOH	               5782
	float fSglMaxRes;                // 单体内阻最大值	       5784	
	float fSglMinRes;                // 单体内阻最小值		   5787
	
	float fBCMUBankVol; 	         // BCMU组端电压		                            6002
	float fBCMUBankCur; 	         // BCMU组电流		                                6004
	float fBCMUBankTemp; 	         // BCMU环境温度		                            6006
	quint32	uiBCMUVersion;       	 // BCMU版本号		                                6008	
	float fBCMUPosRes; 	             // BCMU 正极绝缘电阻	                            6010
	float fBCMUNegRes;               // BCMU 负极绝缘电阻	                         	6012

	float fBankChargeEQ; 	         // 电池组可充电量                               	6200
	float fBankDischargeEQ; 	     // 电池组可放电量	                                6202	
	float fStackChargeEQAdd; 	     // 电池堆可充电量累加值	                        6204
	float fStackChargeSoc;           // 电池堆可充SOC	                                6206	
	float fStackChargeSoh; 	         // 电池堆可充SOH	                                6208
	float fStackDischargeEQAdd; 	 // 电池堆可放电量累加值	                        6210
	float fStackDischargeSoc; 	     // 电池堆可放SOC	                                6212
	float fStackDischargeSoh; 	     // 电池堆可放SOH	                                6214
	float fBankChargeEQAdd; 	     // 电池组累计充电电量	                            6216
	float fBankDischargeEQAdd;       // 电池组累计放电电量	                            6218
	float fBankSglChargeEQAdd;     	 // 电池组单次累计充电电量	                        6220
	float fBankSglDischargeEQAdd; 	 // 电池组单次累计放电电量	                        6222
	float fBankChargePower; 	     // 电池组可充功率	                                6224	
	float fBankDischargePower; 	     // 电池组可放功率                                	6226     
}LINUX_PACK_1_BYTE SNetBattBankSglOther;

#ifdef XNWIN
#pragma pack(pop)                  // 恢复对齐状态
#endif

#endif // GPRS_STRUCT_H